// ==UserScript==
// @name         sxyzzy
// @namespace    sxyzzy
// @version      2025.07.01.8
// @author       vettel&fqy
// @description  山东省教师教育网2025互联网+
// @match        *://www.qlteacher.com/
// @match        *://yxjc.qlteacher.com/project/yey2025/*
// @match        *://yxjc.qlteacher.com/project/xx2025/*
// @match        *://yxjc.qlteacher.com/project/cz2025/*
// @match        *://yxjc.qlteacher.com/project/gz2025/*
// @match        *://player.qlteacher.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=qlteacher.com
// @license      vettel
// @grant        none
// ==/UserScript==
(function() {
    'use strict';

    // 显示加载成功提示 - 只显示一次
    function showLoadSuccessNotification() {
        if(document.getElementById('qlteacher-script-notification')) return;
        const notification = document.createElement('div');
        notification.id = 'qlteacher-script-notification';
        notification.style.cssText = `
            position: fixed;
            top: 20px;
            left: 50%;
            transform: translateX(-50%);
            padding: 10px 20px;
            background-color: #2196F3;
            color: white;
            border-radius: 4px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
            z-index: 999999;
            font-family: Arial, sans-serif;
            font-size: 14px;
        `;
        notification.textContent = 'sxyzzy脚本加载成功！注意地址栏是否阻止弹出窗口了！！！当前版本2025.07.01.8';
        document.body.appendChild(notification);
        // 3秒后自动消失
        setTimeout(() => {
            notification.remove();
        }, 3000);
    }

    // 在脚本开始时显示初始通知 - 只调用一次
    showLoadSuccessNotification();

    // 监听窗口活跃状态
    function isFocus(){
        if(!document.hidden){
            window.location.reload();
            console.log("Refresh the course status!");
        }
    }
    document.addEventListener("visibilitychange", isFocus);

    // 主页面学习按钮处理
    function coursesPage(){
        if(document.URL.includes('yxjc.qlteacher.com/project/yey2025/lesson/learn') ||
           document.URL.includes('yxjc.qlteacher.com/project/xx2025/lesson/learn') ||
           document.URL.includes('yxjc.qlteacher.com/project/cz2025/lesson/learn') ||
           document.URL.includes('yxjc.qlteacher.com/project/gz2025/lesson/learn')){

            if(!document.hidden){
                setTimeout(() => console.log("mainpage waiting..."), 500);
                var buttons = document.getElementsByTagName("button");
                for(var i=0; i<buttons.length; i++){
                    var spans = buttons[i].getElementsByTagName("span");
                    for(var j=0; j<spans.length; j++){
                        if(spans[j].innerText){
                            if(spans[j].innerText.includes("继续学习") || spans[j].innerText.includes("开始学习")){
                                console.log("检测到课程学习按钮，即将尝试点击...");
                                buttons[i].click();
                                return;
                            }
                            else if(spans[j].innerText.includes("已完成学习")){
                                window.close();
                                return;
                            }
                        }
                    }
                }
            }
        }
    }

    setInterval(coursesPage, 3000);

    // 视频播放页学习按钮处理
    function coursePage(){
        var patt = /^https:\/\/player.qlteacher.com\/learning\/[^=]*/;
        if(patt.test(document.URL)){
            var buttons = document.getElementsByTagName("button");
            for(var i=0; i<buttons.length; i++){
                var spans = buttons[i].getElementsByTagName("span");
                for(var j=0; j<spans.length; j++){
                    if(spans[j].innerText){
                        if(spans[j].innerText.includes("继续学习") || spans[j].innerText.includes("开始学习")){
                            console.log("检测到课程学习按钮，即将尝试点击...");
                            buttons[i].click();
                            return;
                        }
                        if(spans[j].innerText.includes("已完成学习")){
                            window.close();
                            return;
                        }
                    }
                }
            }
        }
    }
    setInterval(coursePage, 1000);

    // 点击确认窗口的确定按钮
    function clickConfirmButton() {
        var buttons = document.getElementsByTagName("button");
        for(let btn of buttons) {
            if(btn.innerText?.trim() === "确定") {
                btn.click();
                return true;
            }
        }
        return false;
    }

    // 全局视频播放控制标志
    var videoPlaybackEnabled = true;

    // 强化版播放视频函数 - 多次尝试播放
    function playVideo() {
        // 如果视频播放被禁用，则不执行播放
        if(!videoPlaybackEnabled) {
            return;
        }

        // 尝试立即播放视频
        setTimeout(() => {
            var videos = document.getElementsByTagName('video');
            if(videos.length > 0) {
                var video = videos[0];
                // 确保视频可以自动播放（设置为静音模式）
                video.muted = true;

                // 首次尝试播放
                attemptPlayVideo(video, 0);
            } else {
                // 如果没有找到视频元素，可能是页面还在加载，稍后再试
                console.log("未找到视频元素，稍后重试...");
                // 延迟一段时间后再次尝试
                setTimeout(playVideo, 1000);
            }
        }, 1000); // 延迟1秒确保页面加载完成
    }

    // 尝试播放视频，如果失败则重试
    function attemptPlayVideo(video, attemptCount) {
        // 尝试播放视频
        var playPromise = video.play();

        // 处理播放可能被拒绝的情况
        if (playPromise !== undefined) {
            playPromise.then(() => {
                // 播放成功
                console.log("视频播放成功");
            }).catch(error => {
                console.log("视频自动播放被阻止(尝试 " + (attemptCount + 1) + "):", error);

                // 如果尝试次数小于3，则继续尝试
                if (attemptCount < 3) {
                    // 增加延迟后重试
                    setTimeout(() => {
                        attemptPlayVideo(video, attemptCount + 1);
                    }, 500 * (attemptCount + 1)); // 逐渐增加延迟时间
                } else {
                    // 已经尝试了3次，放弃自动播放
                    console.log("已尝试多次仍无法播放视频");
                }
            });
        }
    }

    // 改进版答题处理函数 - 使用对象来维护状态
    var questionHandler = {
        isProcessing: false,

        // 处理题目函数
        handle: function(type) {
            // 防止重复处理
            if(this.isProcessing) {
                return;
            }
            this.isProcessing = true;

            // 获取选择题元素
            let items;
            if (type === 'multiple') {
                // 多选题
                items = document.getElementsByClassName("ant-checkbox");
            } else if (type === 'single') {
                // 单选题
                items = document.getElementsByClassName("ant-radio-input");
            } else {
                // 未知类型，直接返回
                this.isProcessing = false;
                return;
            }

            if(items.length === 0) {
                this.isProcessing = false;
                return;
            }

            // 检查是否已有选中的选项
            var hasSelected = false;
            for(let item of items) {
                if(item.checked) {
                    hasSelected = true;
                    break;
                }
            }

            // 选择选项
            if (type === 'multiple') {
                // 多选题: 随机选择至少一个选项
                if(!hasSelected) {
                    var selected = 0;
                    while(selected < 1 && selected < items.length) {
                        var randomIndex = Math.floor(Math.random() * items.length);
                        if(!items[randomIndex].checked) {
                            items[randomIndex].click();
                            selected++;
                        }
                    }
                }
            } else if (type === 'single') {
                // 单选题: 随机选择一个未选中的选项
                if(!hasSelected) {
                    // 获取所有未选中的选项
                    var unselectedItems = [];
                    for(let item of items) {
                        if(!item.checked) {
                            unselectedItems.push(item);
                        }
                    }

                    // 如果有未选中的选项，随机选择一个
                    if(unselectedItems.length > 0) {
                        var randomIndex = Math.floor(Math.random() * unselectedItems.length);
                        unselectedItems[randomIndex].click();
                    }
                }
            }

            // 查找并点击提交按钮
            var submitBtns = document.getElementsByClassName("ant-btn radius-4 px-lg py0 ant-btn-primary");
            if(submitBtns.length === 0) {
                this.isProcessing = false;
                return;
            }

            // 临时禁用视频播放
            var originalVideoState = videoPlaybackEnabled;
            videoPlaybackEnabled = false;

            // 点击提交按钮
            submitBtns[0].click();

            // 3秒后检查是否需要重新提交
            setTimeout(() => {
                // 尝试点击确定按钮
                clickConfirmButton();

                // 重置处理标志
                this.isProcessing = false;

                // 恢复视频播放状态
                videoPlaybackEnabled = originalVideoState;

                // 检查是否仍然有提交按钮(表示答错了)
                if(document.getElementsByClassName("ant-btn radius-4 px-lg py0 ant-btn-primary").length > 0) {
                    // 答题失败，重新尝试
                    console.log("答题失败，重新尝试...");
                    // 延迟后重新尝试
                    setTimeout(() => {
                        // 递归调用自身，重新处理同一类型的题目
                        this.handle(type);
                    }, 500);
                } else {
                    // 答题成功，播放视频
                    if(videoPlaybackEnabled) {
                        playVideo();
                    }
                }
            }, 3000);
        }
    };

    // 为方便调用，创建特定的处理函数
    function handleMultipleChoice() {
        questionHandler.handle('multiple');
    }

    function handleSingleChoice() {
        // 直接使用改进后的单选题处理逻辑，不再需要单独的函数
        questionHandler.handle('single');
    }

    // 核心播放逻辑
    function play(){
        var patt = /^https:\/\/player.qlteacher.com\/learning\/[^=]*/;
        if(patt.test(document.URL)){
            // 测试题处理
            function handleTestPage() {
                var elements = document.getElementsByClassName("segmented-text-ellipsis mr-16");
                if(elements.length === 0) elements = document.getElementsByClassName("segmented-text-ellipsis");
                if(elements.length > 0 && elements[0].innerText.includes("测试题")) {
                    console.log('检测到测试题页面，即将开始答题...');
                    var tests = document.getElementsByClassName("mb-16 ng-star-inserted");
                    for(var t=0; t<tests.length; t++){
                        var labels = tests[t].querySelectorAll("label");
                        if(labels.length > 0) labels[0].click();
                    }
                    return true;
                }
                return false;
            }

            function checkTestPage() {
                if(handleTestPage()) return;
                setTimeout(checkTestPage, 500);
            }
            checkTestPage();

            // 启动多选题和优化后的单选题处理
            if(document.getElementsByClassName("ant-checkbox").length > 0 && !questionHandler.isProcessing) {
                handleMultipleChoice();
            } else if(document.getElementsByClassName("ant-radio-input").length > 0 && !questionHandler.isProcessing) {
                handleSingleChoice(); // 现在handleSingleChoice已经实现了随机选择功能
            }

            // 完成状态检测
            var countDownElements = document.getElementsByClassName('count-down ng-star-inserted');
            if(countDownElements.length > 0 && countDownElements[0].innerText === "已完成"){
                window.close();
            }
        }
    }

    // 设置定时器，定期执行play函数
    setInterval(play, 1000);

    // 这是为了确保新窗口打开后立即尝试播放视频 - 特别优化新窗口的视频播放
    window.addEventListener('load', function() {
        console.log("页面加载完成，立即尝试播放视频...");

        // 不仅调用playVideo，还直接尝试查找并播放视频
        var videos = document.getElementsByTagName('video');
        if(videos.length > 0) {
            var video = videos[0];
            console.log("找到视频元素，立即尝试播放...");

            // 强制显示视频控件（调试用，正式使用时可以注释掉）
            // video.controls = true;

            // 确保视频静音以符合自动播放策略
            video.muted = true;

            // 直接尝试播放，不等待
            var playPromise = video.play();
            if (playPromise !== undefined) {
                playPromise.then(() => {
                    console.log("视频直接播放成功");
                }).catch(error => {
                    console.log("视频直接播放失败:", error);

                    // 关键修改：立即开始快速重试，不再等待playVideo的延迟
                    console.log("视频直接播放失败，立即开始快速重试...");
                    immediateRetryPlay(video, 0);
                });
            }
        } else {
            console.log("未找到视频元素，调用playVideo函数稍后尝试...");
            playVideo();
        }
    });

    // 新增：立即重试播放视频函数
    function immediateRetryPlay(video, attemptCount) {
        // 如果尝试次数超过8次，则放弃（比之前更多次尝试）
        if (attemptCount >= 8) {
            console.log("新窗口视频：已尝试多次仍无法播放视频，放弃自动播放");
            // 即使多次失败，也添加一个最终的延迟尝试
            setTimeout(() => {
                console.log("新窗口视频：执行最终尝试播放...");
                var playPromise = video.play();
                if (playPromise !== undefined) {
                    playPromise.then(() => {
                        console.log("新窗口视频最终尝试播放成功");
                    }).catch(error => {
                        console.log("新窗口视频最终尝试播放失败:", error);
                    });
                }
            }, 3000); // 最终尝试等待3秒
            return;
        }

        // 计算下次尝试的延迟时间，初始延迟非常短，快速重试
        var delay = Math.min(200 * Math.pow(1.2, attemptCount), 1000); // 最大延迟1秒

        console.log(`新窗口视频：播放失败，将在${delay/1000}秒后进行第${attemptCount + 1}次尝试...`);

        setTimeout(() => {
            var playPromise = video.play();
            if (playPromise !== undefined) {
                playPromise.then(() => {
                    console.log("新窗口视频立即重试播放成功");
                }).catch(error => {
                    console.log("新窗口视频立即重试播放失败:", error);
                    // 继续快速重试
                    immediateRetryPlay(video, attemptCount + 1);
                });
            }
        }, delay);
    }
})();